home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / a_utils / ffccflow / ffccflow.lha / ffccc+flow / ffccc / MIXMOD.f < prev    next >
Encoding:
Text File  |  1992-07-31  |  5.5 KB  |  168 lines

  1.       SUBROUTINE MIXMOD(NGLOBF) 
  2. C! Checks for Mixed Mode expressions
  3.       include 'PARAM.h' 
  4.       include 'ALCAZA.h' 
  5.       include 'CLASS.h' 
  6.       include 'CURSTA.h' 
  7.       include 'FLWORK.h' 
  8.       include 'KEYCOM.h' 
  9.       include 'TYPDEF.h' 
  10.       include 'JOBSUM.h' 
  11.       include 'STATE.h' 
  12.       include 'FLAGS.h' 
  13.       include 'USIGNO.h' 
  14.       include 'USLIST.h' 
  15.       include 'USGCOM.h' 
  16.       include 'USSTMT.h' 
  17.       include 'USUNIT.h' 
  18.       include 'USARGS.h' 
  19.       include 'USLTYD.h' 
  20.       include 'STACK.h' 
  21.       CHARACTER*1 STYP  
  22.       CHARACTER*(LOPER) SOPT
  23.       INTEGER ISTART(2),IFINIS(2)   
  24.       CHARACTER*6 CREL(11)  
  25.       CHARACTER*256 STEMP   
  26.       INTEGER LPS(256)  
  27.       INTEGER LREL(11)  
  28.       DATA CREL /'.EQV. ','.NEQV.','.OR.  ','.AND. ','.NOT. ',  
  29.      &           '.GT.  ','.GE.  ','.LT.  ','.LE.  ','.EQ.  ',  
  30.      &           '.NE.  '/  
  31.       DATA LREL /5,6,4,5,5,4,4,4,4,4,4/ 
  32. C   
  33. C CALLED FROM URTERM FOR EACH STATEMENT IN THE MODULE   
  34. C   
  35.       ICL1 = ICURCL(1)  
  36.       ICL2 = ICURCL(2)  
  37. C   
  38. C RETURN UNLESS AN ASSIGNMENT STATEMENT 
  39. C   
  40.       IF(LIFF(ICL1)) THEN   
  41.         IF(.NOT.LASIGN(ICL2)) RETURN
  42.         IUP = 2 
  43. C find end of IF
  44.         JPT = INDEX(SSTA(:NCHST),'(')   
  45.         CALL SKIPLV(SSTA,JPT+1,NCHST,.FALSE.,KND,ILEV)  
  46.         ISTART(1) = JPT+1   
  47.         ISTART(2) = KND+1   
  48.         IFINIS(1) = KND-1   
  49.         IFINIS(2) = NCHST   
  50.       ELSE IF(LASIGN(ICL1)) THEN
  51.         IUP = 1 
  52.         KND = NCHST 
  53.         ISTART(1) = 1   
  54.         IFINIS(1) = NCHST   
  55.       ELSE  
  56.         RETURN  
  57.       ENDIF 
  58. C loop over parts of the statement  
  59.       DO 20 IPART=1,IUP 
  60. C zero stack address
  61.         NLEVL = 0   
  62.         IF(IPART.EQ.1) THEN 
  63.           ICL=ICL1  
  64.         ELSE
  65.           ICL=ICL2  
  66.           IF(.NOT.LASIGN(ICL))                                   GOTO 20
  67.         ENDIF   
  68. C KST and KND mark the start and end of the assignment part of the statement
  69.         KST = ISTART(IPART) 
  70.         KND = IFINIS(IPART) 
  71. C       WRITE(6,'(A,A)') ' Statement : ',SSTA(KST:KND)  
  72. C this part of statement is an assignment or is inside IF clause
  73. C move from left to right, character by character   
  74.         NLO1 = 1
  75.         ICHR = KST  
  76.     5   CONTINUE
  77.         IF(ICHR.EQ.KND+1) THEN  
  78. C put end of expression operator
  79.           CALL PUTOPT('END',3,ICHR,IERR)
  80.           IF(IERR.GT.0)                                          GOTO 25
  81.           IF(IERR.LT.0) THEN
  82.             NGLOBF = NGLOBF + 1 
  83.                                                                  GOTO 40
  84.           ENDIF 
  85.                                                                  GOTO 20
  86.         ENDIF   
  87.         IF(SSTA(ICHR:ICHR).EQ.' ') THEN 
  88. C ignore blanks 
  89.           ICHR = ICHR + 1   
  90.                                                                   GOTO 5
  91.         ENDIF   
  92. C NLO is the index to the statement name last found 
  93.         NLO = NLO1  
  94.         ICHRE = 0   
  95. C find if this character is start of a name 
  96.         DO 10 ISN=NLO,NSNAME
  97.           IF(NSSTRT(ISN).NE.ICHR)                                GOTO 10
  98.           NLO1 = ISN + 1
  99.           ICHRE = NSEND(ISN)
  100. C convert the name type to the smaller subset   
  101.           CALL TY2TYP(ISN,STYP) 
  102. C add this operand to the stack 
  103.           CALL PUTOPA(SNAMES(ISN+ISNAME),STYP,ICHR,ICHRE,IERR)  
  104.           IF(IERR.NE.0)                                          GOTO 30
  105.           ICHR = ICHRE + 1  
  106. C go for the next character after this name 
  107.                                                                   GOTO 5
  108.    10   CONTINUE
  109. C next name is at NLO1  
  110.         IF(NLO1.GT.NSNAME) THEN 
  111.           IFIN = KND
  112.         ELSE
  113.           IFIN = NSSTRT(NLO1)-1 
  114.         ENDIF   
  115.         ISTA = ICHR 
  116. C analyse this part of statement (ISTA:IFIN) since it is
  117. C not a name, may be an operator
  118.         ILEN = IFIN-ISTA+1  
  119.         CALL GETOPT(SSTA(ISTA:IFIN),ILEN,SOPT,LOPT,IERR)
  120.         IF(IERR.NE.0)                                            GOTO 15
  121. C found an operator of length LOPT, called SOPT 
  122. C put the operator on the stack 
  123.         CALL PUTOPT(SOPT,LOPT,ICHR,IERR)
  124.         IF(IERR.GT.0)                                            GOTO 15
  125.         IF(IERR.LT.0) THEN  
  126.           NGLOBF = NGLOBF + 1   
  127.         ENDIF   
  128.         ICHR = ICHR + LOPT  
  129.                                                                   GOTO 5
  130.    15   CONTINUE
  131. C not a name, not an operator, so   
  132. C check if start of a constant. Remove blanks first 
  133.    98   NC=0
  134.         DO 97 IC=ISTA,IFIN  
  135.           IF(SSTA(IC:IC).EQ.' ') GOTO 97
  136.           NC=NC+1   
  137.           LPS(NC)=IC-ISTA   
  138.           STEMP(NC:NC) = SSTA(IC:IC)
  139.    97   CONTINUE
  140. C remove .EQ. etc which confuse GETCON  
  141.         DO 95 IREL=1,11 
  142.           LP=INDEX(STEMP(:NC),CREL(IREL)(:LREL(IREL)))  
  143.           IF(LP.EQ.0) GOTO 95   
  144.           IFIN = ISTA + LPS(LP) - 1 
  145.           GOTO 98   
  146.    95   CONTINUE
  147.         CALL GETCON(SSTA,ISTA,IFIN,KLCH,STYP)   
  148.         IF(KLCH.NE.0) THEN  
  149. C found a constant. place on the stack  
  150.           CALL PUTOPA(SSTA(ISTA:KLCH),STYP,ICHR,KLCH,IERR)  
  151.           IF(IERR.NE.0)                                          GOTO 35
  152.           ICHR = KLCH + 1   
  153.                                                                   GOTO 5
  154.         ENDIF   
  155. C not a name,operand or constant. this is an error. type the offender   
  156.         LCST = MIN(70,NCHST)
  157.         WRITE(MZUNIT,500) SSTA(1:LCST)  
  158.    20 CONTINUE  
  159.                                                                  GOTO 40
  160.    25 CONTINUE  
  161.    30 CONTINUE  
  162.    35 CONTINUE  
  163.    40 CONTINUE  
  164.       RETURN
  165.   500 FORMAT(1X,'!!! NON-FATAL ERROR IN MIXMOD ...',
  166.      +' UNABLE TO PARSE: ',A)   
  167.       END   
  168.